#ifndef POOL_HPP
#define POOL_HPP
#include <queue>
#include <mutex>
#include <string>
#include <cstring>
#include <atomic>
#include <thread>
#include <memory>
#include <shared_mutex>
#include <chrono>
#include <condition_variable>
#include "../../_debug/include/debug_setting.h"
#include "../include/task.hpp"


typedef std::shared_lock<std::shared_timed_mutex> rlock;        // 读锁
typedef std::unique_lock<std::shared_timed_mutex> wlock;        // 读锁

/* 线程池 会创建 now_nums+1 个线程 1为管理线程 */
class Pool{
private:
    _Tasks tasks;                   // 线程队列
    int max_nums;                   // 最多能开的线程数量
    int now_nums;                   // 当前线程数量
    int idle_nums;                  // 空闲线程数量
    int busy_nums;                  // 忙碌线程数量
    std::shared_timed_mutex mtx;    // 线程互斥量
    std::thread *threads;           // 线程池数组
    std::thread manageID;             // 管理线程
    std::atomic<bool> shutdown;     // 是否销毁线程池 1 销毁 0 不销毁
    std::condition_variable_any pool_cond; //通知进来了新任务 or 线程应该销毁了
    std::condition_variable_any shutThead; // 通知关闭线程


public:
    Pool(int now_nums=2,int max_nums=10);
    ~Pool();

    static void* manage(void* arg);
    static void* worker(void* arg);
    void addTasks(_Task* task);
};
#endif